/*
 * FileName: adapter.cc
 * Author: 李波(Edwin Lee)
 * Date: 2024-07-17 10:56:06
 * Version: 1.0
 * Description: 定义： 适配器模式将某个类的接口转换成客户端期望的另一个接口表示，目的是消除由于接口不匹配所造成的类的兼容性问题。
 * 主要分为三类：类的适配器模式、对象的适配器模式、接口的适配器模式。
 */
#include <iostream>
#include <string>
using namespace std;

//VGA接口类
class VGA
{
public:
	virtual void play() = 0;
	string getType()const {return "VGA";}
};

//支持VGA接口的投影仪
class TV01:public VGA
{
public:
	void play()
	{
		cout<<"通过VGA接口连接投影仪，进行视频播放"<<endl;
	}
};

// 实现一个电脑类(只支持VGA接口)
class Computer
{
public:
	// 由于电脑只支持VGA接口,所以该方法的参数也只能支持VGA接口的指针/引用
	void playVideo(VGA* pVGA)
	{
		pVGA->play();
	}
};

/*
	 方法一：换一个支持HDMI接口的电脑，这个就叫代码重构
	 方法二：提供一个转换头(适配器)，能够把VGA转换成HDMI
*/	 

// 进了一批新的投影仪，但是新的投影仪都是只支持HDMI接口
class HDMI
{
public:
	virtual void play() = 0;
};

//只支持HDMI的投影仪
class TV02:public HDMI 
{
public:
	void play()
	{
		cout<<"通过HDMI接口连接投影仪,进行视频播放"<<endl;
	}
};

// 由于电脑(VGA接口)和投影仪(HDMI接口)无法直接相连,所以需要添加适配器类
class VGAToHDMIAdapter:public VGA 
{
public:
	VGAToHDMIAdapter(HDMI* p) :pHdmi(p){}
	// 该方法相当于就是转换头,做不同接口的信号转换
	void play()
	{
		pHdmi->play();
	}
private:
	HDMI* pHdmi;
};

int main()
{
	Computer computer;
	//TV01 vga;
	//computer.playVideo(&vga);
	computer.playVideo(new VGAToHDMIAdapter(new TV02));
	return 0;
}
